package AnaliseLexicaFinal.Analise;

import AnaliseLexicaFinal.EstruturaDeDados.Codigo;
import AnaliseLexicaFinal.EstruturaDeDados.ErroLexico;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import AnaliseLexicaFinal.EstruturaDeDados.TabelaSimbolos;

import java.util.LinkedList;

/**
 * Classe que realiza a an&aacutelise l&eacutexica sobre o c&oacutedigo fonte
 * @version 1.0
 * @author Linton - implementa&ccedil&atildeo
 * @author Edney - implementa&ccedil&atildeo
 * @author Nathy - implementa&ccedil&atildeo
 * @author Elisson - Coment&aacuterios e revis&atildeo
 * @author amferraz - getListaTokens()
 */
public class AnalisadorLexico {
    public Codigo codigo;
    public LinkedList<LinkToken> tokens;
    public LinkedList<ErroLexico> erros;
    public Automato automato;
    public TabelaSimbolos tabela = new TabelaSimbolos(); 
    
    /**
	 * Obtem pr&oacuteximo <i>Token</i> do c&oacutedigo
	 * @return <i>Token</i> encontrado
	 */
    public LinkToken proximoToken(){
    	try {
			LinkToken token =automato.proximoToken();
			return token;
		} catch (ErroLexicoException e) {
			while (e.size() != 0){
				erros.add(e.getErros());
			}
			return null;
		}
    }

    /**
     * Retorna todos <i>Token</i> de um c&oacutedigo
     * @param codigo - C&oacutedigo fonte
     * @return <i>Token</i> do c&oacutedigo
     */
    public void buscarTokens(String codigo) {
    	tokens = new LinkedList<LinkToken>();
        erros = new LinkedList<ErroLexico>();
    	this.codigo = new Codigo(codigo);
    	this.automato = new Automato(this.codigo);
    	String tokenreal; //Verificar o token real quando for identificador ou palavra reservada
    	
    	LinkToken atual;
    	
    	while (this.codigo.existeCaractere()){
    		atual = proximoToken();
    		if(atual != null){
    			if(atual.getToken().equals("identificador")){
    		    	tokenreal = tabela.instanciaToken(atual.getLexema());
    		    	atual.setToken(tokenreal);
    	    	}
    	    	tokens.add(atual);
    		}	
    	}
    }



    public LinkedList<LinkToken> getListaTokens(){
        return this.tokens;
    }
}

